#ifndef __ETHARP_H__
#define __ETHARP_H__
#include "stm32f4xx.h"
#include "netif.h"
#include "pbuf.h"
//#include "KSZ8863.h"
#define ntohs(n) ((((short)(n)) & 0xff00) >> 8 | (((short)(n)) & 0xff) << 8)
#define htons(n) ntohs(n)
#define ntohl(x) ((((x)&0xff000000)>>24) | (((x)&0x00ff0000)>>8) | (((x)&0x0000ff00)<<8) | (((x)&0x000000ff)<<24))
#define htonl(n) ntohl(n) 

/*Art数据类型*/
#define          Ethernet      0x0001
/*硬件地址的长度*/
/*协议的长度*/
/*广播地址*/
#define LL_BORADCAST            0xFF 
/*MAC的数据类型，IP/Arp，需要加的自行添加*/
#define ETHTYPE_ARP       0x0806U
#define ETHTYPE_IP        0x0800U
/*Opcode*/
#define Arp_Request       0x0001
#define Arp_Reply         0x0002

/*ETH固定长度*/
#define ETH_PAD_SIZE     0
#define SIZEOF_ETH_HDR  (14 + ETH_PAD_SIZE)

//以太网头部
struct eth_hdr{

  PACK_STRUCT_FIELD(uint8_t dest[6]);
  PACK_STRUCT_FIELD(uint8_t src[6]);
  PACK_STRUCT_FIELD(uint16_t type);
};


typedef struct{ //以太网头部+ARP首部结构
  uint16_t       hwtype;      //硬件类型(1表示传输的是以太网MAC地址)
  uint16_t       protocol;    //协议类型(0x0800表示传输的是IP地址)
  uint8_t        hwlen;       //硬件地址长度(6)
  uint8_t        protolen;    //协议地址长度(4)
  uint16_t       opcode;      //操作(1表示ARP请求,2表示ARP应答)
  uint8_t        smac[6];     //发送端MAC地址
  uint8_t       sipaddr[4];  //发送端IP地址
  uint8_t        dmac[6];     //目的端MAC地址
  uint8_t       dipaddr[4];  //目的端IP地址
}Pack_arp_hdr;
/*Eth 数据解析函数*/
uint8_t ethernet_input(struct pbuf *p, struct netif *netif);
/*Eth IP解析函数*/
void
ip_input(struct netif *netif,struct pbuf *p);
/*UDP解析数据函数*/
void 
udp_input(struct netif *netif,struct pbuf *p);
/*TCP解析数据函数*/
void 
tcp_input(struct netif *netif,struct pbuf *p);
/*
***建立连接应答
*/
void 
tcp_ack_smmp(struct netif *netif,struct pbuf *p,ip_addr_t *addr);
/*
**回复收到的数据
*/
void
tcp_smpprev_ack(struct netif *netif,struct pbuf *p,ip_addr_t *addr);
/*将数据打包*/
void
pbuf_tack(struct pbuf *pbuf,const void *dataptr);
/**Udp发送函数，无校验和*/
void
udp_send_to(struct netif *netif,struct pbuf *p,ip_addr_t *addr, uint16_t port); 
/*IP层数据输出函数*/
void 
ip_output(struct netif *netif,struct pbuf *p,ip_addr_t *addr);
/*eth数据包*/
void 
eth_output(struct netif *netif,struct pbuf *p);

#endif
